package cn.dj.system.service.impl;

import cn.dj.system.domain.Menu;
import cn.dj.system.mapper.MenuMapper;
import cn.dj.system.service.IMenuService;
import cn.dj.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 业务实现类：菜单
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {
    @Autowired//注入
    private MenuMapper menuMapper;

    @Override
    public List<Menu> menuTree() {
        List<Menu> menus = menuMapper.loadAll();
        //1.将所有Menu信息保存在Map中，方便根据id去获取当前Menu对象，就不用查数据库了-先查出来存在内存中了
            Map<Long, Menu> map = new HashMap<>();
            for (Menu menu : menus) {
                map.put(menu.getId(), menu);
            }

            //2.获取菜单树：遍历所有的菜单，没有父id就直接添加到菜单树，有父id，将自己装到父菜单的children中
            List<Menu> menuTree = new ArrayList<>();//菜单树
            for (Menu menu : menus) {
                if (menu.getParentId() == null) {//一级菜单
                    menuTree.add(menu);
                } else {
                    //3.如果不是顶级菜单【parent_id!=null]】，找到自己的父菜单，将自己加到父菜单的children集合
                    //获取父部门的id - 是为了获取父部门对象 - 获取父部门的children集合
                    Long parentId = menu.getParentId();
                    //根据id获取父部门对象
                    Menu parentMenu = map.get(parentId);
                    //防止父部门数据的删除引起的空指针异常
                    if (parentMenu != null) {//为null不能调用方法，会报错
                        parentMenu.getChildren().add(menu);
                    }
                }

            }
            return menuTree;
        }
    }

